package ar.com.mobile.persistence.container;

import java.io.File;
import java.util.Observable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class PropertyService extends Observable implements Runnable{
	/**
	 * Indica la ultima vez que fue accedido el archivo
	 */
	private long lastModified = 0L;
	/**
	 * Representa la ruta del archivo al cual vamos a estar observando la fecha de modificacion
	 */
	private String path = null;	
	/**
	 * Servicio que vamos a utilizar para verificar el periodo en el cual se va a revisar el archivo
	 */
	private final ScheduledExecutorService fScheduler = Executors.newScheduledThreadPool(1);;
	
	/**
	 * Constructor de la clase, permite establecer la ruta del archivo que vamos a observar la 
	 * fecha de cambio y la fecha en la cual fue accedido por ultima vez. Por defecto, el tiempo de
	 * inicio (en segundos) es de 5 y las repeticiones se van a dar (en segundos) cada 5.
	 * @param lastModified Fecha (en milisegundos) en la cual el archivo fue accedido
	 * @param path Ruta del archivo a observar
	 */
	public PropertyService(long lastModified, String path) {		
		this.lastModified = lastModified;
		this.path = path;		
		this.fScheduler.scheduleWithFixedDelay(this, 5, 5, TimeUnit.SECONDS);
	}
	
	/**
	 * Constructor de la clase, permite establecer la ruta del archivo que vamos a observar la 
	 * fecha de cambio y la fecha en la cual fue accedido por ultima vez
	 * @param lastModified Fecha (en segundos) en la cual el archivo fue accedido
	 * @param path Ruta del archivo a observar
	 * @param initialDelay Tiempo (en milisegundos) en el cual se va a empezar a revisar el fichero
	 * @param delay Tiempo (en segundos) en el cual se va a seguir revisando el archivo
	 */
	public PropertyService(long lastModified, String path, long initialDelay, long delay) {		
		this.lastModified = lastModified;
		this.path = path;		
		this.fScheduler.scheduleWithFixedDelay(this, initialDelay, delay, TimeUnit.SECONDS);
	}	

	@Override
	public void run() {
		File f = new File(path);		
		
		if (f.lastModified() != this.lastModified){
			lastModified = f.lastModified();
			setChanged();
			notifyObservers();
		}
	}

}